home *** CD-ROM | disk | FTP | other *** search
- #include <Quickdraw.h>
- #include <Windows.h>
- #include <dialogs.h>
- #include <OSEvents.h>
- #include <Memory.h>
- #include <Packages.h>
- #include <Sound.h>
- #include <SoundInput.h>
- #include <OSUtils.h>
-
- #define TRUE 0xFF
- #define FALSE 0
- #define buffSize 0x10000
-
- typedef struct {
- short OnOff;
- short Level;
- } Level;
-
-
- pascal void MyRecComp (SPBPtr inParamPtr);
-
- main()
- {
- OSErr err;
- SPBPtr RecordRec;
- long SoundRefNum;
- Handle Buffer, Buffer2;
- SndChannelPtr chan;
- Level myLevel;
- short headerlength, headerlength2, dummy;
- Fixed sampleRate;
- SndCommand mycmd;
-
- err = SPBOpenDevice ('', siWritePermission, &SoundRefNum);
- if (err != noErr)
- Debugger();
-
- myLevel.OnOff = 0;
- myLevel.Level = 0;
- err = SPBSetDeviceInfo (SoundRefNum,siPlayThruOnOff, (Ptr) &myLevel);
- if (err != noErr)
- Debugger();
-
- myLevel.OnOff = 0;
- myLevel.Level = 0;
- err = SPBSetDeviceInfo (SoundRefNum,siTwosComplementOnOff, (Ptr) &myLevel);
- if (err != noErr)
- Debugger();
-
- err = SPBGetDeviceInfo (SoundRefNum,siSampleRate, (Ptr) &sampleRate);
- if (err != noErr)
- Debugger();
-
- RecordRec = (SPBPtr) NewPtr(sizeof (SPB));
- if (MemError() != noErr || RecordRec == nil)
- Debugger();
-
- Buffer = NewHandle(buffSize);
- if (MemError() != noErr || Buffer == nil)
- Debugger();
- HLock (Buffer);
-
- err = SetupSndHeader (Buffer, 1, sampleRate, 8, 'NONE', 0x3C, 0, &headerlength);
- if (err != noErr)
- Debugger();
- err = SetupSndHeader (Buffer, 1, sampleRate, 8, 'NONE', 0x3C, buffSize - headerlength, &dummy);
- if (err != noErr)
- Debugger();
-
- Buffer2 = NewHandle(buffSize);
- if (MemError() != noErr || Buffer2 == nil)
- Debugger();
- HLock (Buffer2);
-
- err = SetupSndHeader (Buffer2, 1, sampleRate, 8, 'NONE', 0x3C, 0, &headerlength2);
- if (err != noErr)
- Debugger();
-
- err = SetupSndHeader (Buffer2, 1, sampleRate, 8, 'NONE', 0x3C, buffSize - headerlength2, &dummy);
- if (err != noErr)
- Debugger();
-
- RecordRec->inRefNum = SoundRefNum;
- RecordRec->count = 0;
- RecordRec->milliseconds = 15000;
- RecordRec->bufferLength = buffSize - headerlength;
- RecordRec->bufferPtr = (Ptr) ((*Buffer) + headerlength);
- RecordRec->completionRoutine = (ProcPtr) &MyRecComp;
- RecordRec->interruptRoutine = nil;
- RecordRec->userLong = 0;
- RecordRec->error = 0;
- RecordRec->unused1 = 0;
-
- chan = nil;
- err = SndNewChannel (&chan, sampledSynth, 0, nil);
- if (err != noErr)
- Debugger();
-
- do {
- err = SPBRecord (RecordRec, TRUE);
- if (err != noErr)
- Debugger();
-
- do {
- } while (RecordRec->userLong == 0);
-
- if (RecordRec->userLong == 10) {
- if (RecordRec->bufferPtr == (Ptr) ((*Buffer) + headerlength)) {
- RecordRec->bufferPtr = (Ptr) ((*Buffer2) + headerlength2);
-
- mycmd.cmd = quietCmd;
- mycmd.param1 = 0;
- mycmd.param2 = 0;
-
- err = SndDoCommand (chan, &mycmd, FALSE);
- if (err != noErr)
- Debugger();
-
- mycmd.cmd = bufferCmd;
- mycmd.param1 = 0;
- mycmd.param2 = (long) ((*Buffer) + 20 /*headerlength2*/);
-
- err = SndDoCommand (chan, &mycmd, FALSE);
- if (err != noErr)
- Debugger();
-
- }
- else {
- RecordRec->bufferPtr = (Ptr) ((*Buffer) + headerlength);
-
- mycmd.cmd = quietCmd;
- mycmd.param1 = 0;
- mycmd.param2 = 0;
-
- err = SndDoCommand (chan, &mycmd, FALSE);
- if (err != noErr)
- Debugger();
-
- mycmd.cmd = bufferCmd;
- mycmd.param1 = 0;
- mycmd.param2 = (long) ((*Buffer2) + 20 /*headerlength2*/);
-
- err = SndDoCommand (chan, &mycmd, FALSE);
- if (err != noErr)
- Debugger();
-
- }
- RecordRec->userLong = 0;
- }
- } while (RecordRec->userLong != 1);
-
- mycmd.cmd = quietCmd;
- mycmd.param1 = 0;
- mycmd.param2 = 0;
-
- err = SndDoImmediate (chan, &mycmd);
- if (err != noErr)
- Debugger();
-
- err = SndDisposeChannel (chan,FALSE);
- if (err != noErr)
- Debugger();
-
- SPBCloseDevice (SoundRefNum);
-
- HUnlock (Buffer);
- HUnlock (Buffer2);
- DisposeHandle (Buffer);
- DisposeHandle (Buffer2);
- DisposePtr ((Ptr) RecordRec);
- }
- /**********************************/
-
- pascal void MyRecComp (SPBPtr inParamPtr)
- {
- inParamPtr->userLong = 10;
-
- if (Button())
- inParamPtr->userLong = 1;
-
- return;
- }
-
- /**********************************/
-